﻿using System.Xml.Linq;

namespace CPN.PJN.Silverlight.Common.Logging
{
    /// <summary>
    /// Cette classe représente un Listener pour le logs
    /// </summary>
    public abstract class LogListener
    {
        #region Name Property

        /// <summary>
        /// Nom du gestionnaire de logs
        /// </summary>
        public string Name { get; set; }

        #endregion

        #region Formatter Property

        /// <summary>
        /// Formatage du Log pour la sortie
        /// </summary>
        public LogFormatter Formatter { get; set; }

        #endregion

        #region Configure abstract Method

        /// <summary>
        /// Configuration du gestionnaire
        /// </summary>
        /// <param name="configurationElement">Element de configuration</param>
        public abstract void Configure(XElement configurationElement);

        #endregion

        #region Write Methods

        /// <summary>
        /// Cette méthode écrit le message de log
        /// </summary>
        /// <param name="message">Message de log</param>
        public virtual void Write(object message)
        {
            this.Write(message, Logger.DEFAULT_CATEGORY);
        }

        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        public abstract void Write(object message, string category);

        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise et sa severité
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        /// <param name="severity">severité</param>
        public abstract void Write(object message, string category, int severity);

        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise et sa severité
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        /// <param name="severity">severité</param>
        /// <param name="data">données supplémentaires à afficher</param>
        public abstract void Write(object message, string category, int severity, params object[] data);

        #endregion
    }
}
